void main(List<String> args) {
  // 默认构造函数不需要返回值
  // 工厂构造函数需要手动返回一个对象
  final p1 = Person.withName("gaolei");
  final p2 = Person.withName('gaolei');

  print(identical(p1, p2));
}

// 普通构造函数 无法满足需求
// class Person {
//   final String name = 'Jack';
//   final String color = 'yellow';

//   const Person(String name);
//   const Person(this.color);
// }

class Person {
  late String name;
  late String color;

  static final Map<String, Person> _nameCache = {};
  static final Map<String, Person> _colorCache = {};

  //普通构造函数：会自动返回创建出来的对象，不能手动返回
  // 工厂构造函数 特点 ：手动返回一个对象
  // 减少了多次创建和销毁的过程
  factory Person.withName(String name) {
    // 检查缓存（_nameCache 和 _colorCache）中是否已存在具有相同名称或颜色的 Person 对象。如果存在，则直接返回缓存中的对象；如果不存在，则创建一个新的 Person 对象，将其添加到缓存中，并返回新创建的对象。
    if (_nameCache.containsKey(name)) {
      return _nameCache[name]!; // 使用非空断言操作符
    } else {
      final p = Person(name, 'default');
      _nameCache[name] = p;
      return p;
    }
  }

  factory Person.withColor(String color) {
    if (_colorCache.containsKey(color)) {
      return _colorCache[color]!;
    } else {
      final p = Person('default', color);
      _colorCache[color] = p;
      return p;
    }
  }
  Person(this.name, this.color);
}
